{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "d54e400b",
   "metadata": {},
   "source": [
    "# 概率论"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "249892d3",
   "metadata": {},
   "source": [
    "## 基础概念"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3ef22ae9",
   "metadata": {},
   "source": [
    "**概率**是一个介于0和1之间$[0, 1]$的数（包含0和1），用于衡量事件发生的可能性。如“明天下雨的概率是0.25”，但通常采用百分比的方式来描述，如“明天由25%的可能性会下雨”。\n",
    "\n",
    "当事件一定不会发生，则概率为0。反之，如果事件一定会发生，则概率为1。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e2d9dc04",
   "metadata": {},
   "source": [
    "### 样本空间和事件"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "99f5350b",
   "metadata": {},
   "source": [
    "**样本空间**是表示某个事件所有可能结果的离散集或连续取值范围，**事件**则是指某件可能发生的事情，通常是某个物理过程的结果。\n",
    "\n",
    "每个事件是样本空间中的单个样本，样本空间则表示事件的所有可能。\n",
    "\n",
    "对于任意样本空间，所有可能结果的概率之和总是1.0。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b64d14d5",
   "metadata": {},
   "source": [
    "### 随机变量\n",
    "\n",
    "用变量$X$来表示抛硬币的可能结果，$X$称为**随机变量**，它取值与样本空间，并对应某种概率。在抛硬币实验中，样本空间是离散的，所以$X$是离散型随机变量，通常用大写字母表示，可以表达为：\n",
    "$$ P(X = H) = p(X = T) = 0.5 $$\n",
    "其中H为正面，T为背面，P表示其后面括号中事件发生的概率。\n",
    "\n",
    "连续型随机变量则取自连续的样本空间，通常用小写字母（如x）来表示。\n",
    "\n",
    "通常讨论随机变量落在样本空间的某个范围内的概率，而不是讨论变量取某个实数值的概率。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4e73d09f",
   "metadata": {},
   "source": [
    "> 如果可以列举整个样本空间，那就可以计算任意事件的概率。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3e3269fd",
   "metadata": {},
   "source": [
    "## 概率法则"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7788dd21",
   "metadata": {},
   "source": [
    "### 事件的概率"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ab5ef8d5",
   "metadata": {},
   "source": [
    "任意事件都属于样本空间，而样本空间包含事件的所有可能结果，因此样本空间中任意事件的概率总是小于或等于1。由此， 对于任意事件A，有$0 \\geqslant P(A) \\geqslant 1$，且对于样本空间中的所有事件A，有$ \\sum_{i} P(A_i) = 1$。如果事件A发生的概率为$P(A)$，那么事件A不发生的概率为$P(\\overline A) = 1 - P(A)$。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b8a82a13",
   "metadata": {},
   "source": [
    "尝试：计算抛三枚硬币的概率。通过10000次抛硬币进行采样，最后统计出4中状态的概率：全反面(0)、1正2反(1)、2正1反(2)、全正面(3)。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "87ec8fc0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1256. 3744. 3751. 1249.]\n",
      "Probabilities: [0.1256 0.3744 0.3751 0.1249]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "N = 10000\n",
    "M = 3\n",
    "heads = np.zeros(M + 1)  # 创建一个4个元素数组，用于记录采样过程中出现[0，1，2，3]个正面的次数。\n",
    "for i in range(N):\n",
    "    flips = np.random.randint(0, 2, M)  # 随机产生3个0或1，用来模拟抛硬币时正反面的随机性\n",
    "    h = np.bincount(flips, minlength=2)  \n",
    "    heads[h[0]] += 1  # h[0]表示0出现的次数\n",
    "print(heads)\n",
    "prob = heads/N\n",
    "print(f'Probabilities: {np.array2string(prob)}')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6029869e",
   "metadata": {},
   "source": [
    "> np.bincount()用于计算非负整数数组中每个值出现的次数（频率），minlength=2确保返回的数组至少由2个元素。\n",
    "> 如：t = np.bincount([1, 2, 1])结果为[0 2 1]，则t[0]=0，数值0出现了0次；t[1]=2，数值1出现了2次；..."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "292e8540",
   "metadata": {},
   "source": [
    "### 加法法则\n",
    "若事件A和事件B不能同时发生，即一次最多只能发生其中一个事件，则称事件A和B**互斥**。如，抛硬币时的正反面。\n",
    "\n",
    "若事件A和B发生的概率完全不相关，即无论事件B是否发生，事件A发生的概率都不受影响，则称事件A和B相互独立。\n",
    "\n",
    "**加法法则关注的是两个或两个以上互斥事件中任意一个事件发生的概率。**\n",
    "\n",
    "例如，抛骰子时掷出4或5的概率是多少？由于这两个事件是互斥的，要么发生一个，要么都不发生。可以表示为：$P(A\\quad or\\quad B) = P(A \\cup B) = P(A) + P(B) $，并适用于多个互斥事件。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "683ca0a2",
   "metadata": {},
   "source": [
    "### 乘法法则\n",
    "若事件A发生且事件B也发生，其概率为：$P(A\\quad and\\quad B) = P(A \\cap B) = P(A)P(B) $。 乘法法则不局限于两个事件，可适用于多个事件。\n",
    "\n",
    "例如，假定世界上有80%的人眼睛是棕色，并且其中有50%是女性，那么如果随机选择一人，其为棕色眼睛女性的概率是多少？\n",
    "\n",
    "利用乘法法则，则为$0.5 \\times 0.8 = 0.4$。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8d08e68a",
   "metadata": {},
   "source": [
    "### 加法法则的修正版\n",
    "之前提到的加法法则适用于互斥的事件，那么如果事件之间并不互斥，则需要将其修正为：$P(A\\quad or\\quad B) = P(A) + P(B) - P(A\\quad and\\quad B)$。\n",
    "\n",
    "例如：一位考古学家发现一个小宝藏，里面有20枚古硬币，其中12枚为罗马币，8枚为希腊币，另外罗马币有6枚银币，希腊币有3枚硬币，剩下的都是青铜币。那么，从这个宝藏里随机选中一枚罗马币或隐蔽的概率是多少？\n",
    "$$ P(银币 \\quad or \\quad 罗马币)=P(银币) + P(罗马币) - P(罗马币 \\quad and \\quad 银币)= \\frac{9}{20} + \\frac{12}{20} - \\frac{6}{20} = 0.75$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f9df3faf",
   "metadata": {},
   "source": [
    "### 生日难题\n",
    "一个房间里平均需要多少人，才能使他们中有两个人的生日在同一天的概率大于50%？"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "py_math",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.18"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
